import BaseModel from "../../base/baseModel.js";


/**
 * @description 商品模型
 * @class {ProductModel}
 * @extends {BaseModel} 基础模型
 * @author hhx
 * @date 2024-12-1 20:12
 * @version 0.1.2
 */
export default class ProductModel extends BaseModel {

    /**
     * @description 商品详情构造函数
     * @public
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props) {
        super(props);
    }

    /**
     * @description 实例化 商品模型
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {ProductModel|*} 商品对象
     */
    static instance(props = {}) {

        let instance = new ProductModel(props);

        instance.init(props);

        return instance;
    }

    //========================== 属性定义 ==========================

    /**
     * @description 获取 商品id
     * @property
     * @protected
     * @return {number} 商品id
     */
    get productId() {
        return this.getPropValue('productId');
    }

    /**
     * @description 设置 商品id
     * @property
     * @protected
     * @param value {number} id
     */
    set productId(value) {
        this.setPropValue('productId', value);
    }

    /**
     * @description 获取 商品名称
     * @property
     * @protected
     * @return {string} 商品名称
     */
    get productName() {
        return this.getPropValue('productName');
    }

    /**
     * @description 设置 商品名称
     * @property
     * @protected
     * @param value {*} 商品名称
     */
    set productName(value) {
        this.setPropValue('productName', value);
    }

    /**
     * @description 获取 商品价格
     * @property
     * @protected
     * @return {number} 商品价格
     */
    get price() {
        return this.getPropValue('price');
    }

    /**
     * @description 设置 商品价格
     * @property
     * @protected
     * @param value {number}
     */
    set price(value) {
        this.setPropValue('price', value);
    }

    /**
     * @description 获取 商品描述
     * @property
     * @protected
     * @return {string} 商品描述
     */
    get description() {
        return this.getPropValue('description');
    }

    /**
     * @description 设置 商品描述
     * @property
     * @protected
     * @param value {string}
     */
    set description(value) {
        this.setPropValue('description', value);
    }

    /**
     * @description 获取 商品库存
     * @property
     * @protected
     * @return {number} 商品库存
     */
    get stock() {
        return this.getPropValue('stock');
    }

    /**
     * @description 设置 商品库存
     * @property
     * @protected
     * @param value {number} 商品库存
     */
    set stock(value) {
        this.setPropValue('stock', value);
    }

    //=========================== 内部成员 ===============================

    //=========================== 成员方法 ===============================

    //=========================== 基础属性 ===============================

    //=========================== 属性方法 ===============================

    //=========================== 接口方法 ===============================

    /**
     * @description 获取商品id
     * @public
     * @return {number} 商品id
     */
    getProductId() {
        return this.productId;
    }

    /**
     * @description 设置商品id
     * @public
     * @param value {number} 商品id
     */
    setProductId(value) {
        this.productId = value;
    }

    /**
     * @description 是否存在商品id
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasProductId() {
        return this.hasProperty('productId');
    }


    /**
     * @description 获取商品名称
     * @public
     * @return {string} 商品名称
     */
    getProductName() {
        return this.productName;
    }

    /**
     * @description 设置商品名称
     * @public
     * @param value {string} 商品名称
     */
    setProductName(value) {
        this.productName = value;
    }

    /**
     * @description 是否存在商品名称
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasProductName() {
        return this.hasProperty('productName');
    }

    /**
     * @description 获取价格
     * @public
     * @return {number} 商品价格
     */
    getPrice() {
        return this.price;
    }

    /**
     * @description 设置商品价格
     * @public
     * @param value {number} 商品价格
     */
    setPrice(value) {
        this.price = value;
    }

    /**
     * @description 是否存在价格
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasPrice() {
        return this.hasProperty('price');
    }

    /**
     * @description 获取商品描述
     * @public
     * @return {string} 商品描述
     */
    getDescription() {
        return this.description;
    }

    /**
     * @description 设置商品描述
     * @public
     * @param value {string} 商品描述
     */
    setDescription(value) {
        this.description = value;
    }

    /**
     * @description 是否存在商品描述
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasDescription() {
        return this.hasProperty('description');
    }

    /**
     * @description 获取商品库存
     * @public
     * @return {number} 商品库存
     */
    getStock() {
        return this.stock;
    }

    /**
     * @description 设置商品库存
     * @public
     * @param value {number} 商品库存
     */
    setStock(value) {
        this.stock = value;
    }

    /**
     * @description 是否存在商品库存
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasStock() {
        return this.hasProperty('stock');
    }

    /**
     * @description 获取商品详情
     * @public
     * @returns {Object} 商品详情
     */
    getProductDetail() {

        if (!this.isNotEmpty(this.getProperties())) {
            return null;
        }

        return this.productListToObject();

    }

    //=========================== 创建方法 ===============================

    //=========================== 构建方法 ===============================

    //=========================== 重载方法 ===============================

    //=========================== 内部方法 ===============================

    /**
     * @description 重载方法
     * @protected
     * @override
     */
    init(props) {
        super.init(props);
    }

    /**
     * @description 转换商品列表格式为Json对象
     * @protected
     */
    productListToObject() {

        let productListMap = this.getProperties();

        let obj = {};

        for (const [k, v] of productListMap) {
            obj[k] = v;
        }

        return obj;
    }

    //=========================== 控制方法 ===============================

}


